package demo04;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Objects;

public class Test01 {
    public static void main(String[] args) {
        List<String> list = new ArrayList<>();
        list.add("dddd");
        list.add("aaaa");
        list.add("aaaa");
        list.add("aaaa");
        list.add("aaaa");
        list.add("aaaa");
        list.add("bbbb");
        list.add("bbbb");
        list.add("bbbb");
        list.add("bbbb");
        list.add("bbbb");
        list.add("bbbb");
        list.add("cccc");
        list.add("cccc");
        list.add("cccc");
        list.add("cccc");
        list.add("cccc");
        list.add("aaaa");
        list.add("aaaa");
        list.add("bbbb");
        List<String> list1 = new ArrayList<>(list);
        removeDuplicateAndLeaveOnly(list);
        removeDuplicateElements(list1);
    }

    private static void removeDuplicateElements(List<String> list) {
        Collections.sort(list);
        int fast = 0;
        int slow = 0;
        while (fast != list.size()) {
            if (!(list.get(fast).equals(list.get(slow)))) {
                slow++;
                list.set(slow,list.get(fast));
            }
            fast++;
        }
        List<String> res = list.subList(0, slow+1);
        System.out.println(res);
    }

    private static void removeDuplicateAndLeaveOnly(List<String> list) {
        // 使用LinkedHashSet保持插入顺序并去重
        // 这种方法更高效，时间复杂度为O(n)，而嵌套循环为O(n^2)
        /*
        LinkedHashSet<String> set = new LinkedHashSet<>(list);
        list.clear();
        list.addAll(set);
        */

        // 如果必须使用列表操作，可以使用以下方式
        for (int i = 0; i < list.size(); i++) {
            String current = list.get(i);
            // 从后往前删除，避免索引变化问题
            for (int j = list.size() - 1; j > i; j--) {
                if (Objects.equals(current, list.get(j))) {
                    list.remove(j);
                }
            }
        }
        System.out.println(list);
    }
}
